home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / postgres / postgre4.z / postgre4 / src / planner / path / mergeutils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-27  |  3.8 KB  |  142 lines

  1.  
  2. /*     
  3.  *      FILE
  4.  *         mergeutils
  5.  *     
  6.  *      DESCRIPTION
  7.  *         Utilities for finding applicable merge clauses and pathkeys
  8.  *     
  9.  */
  10.  
  11. /* RcsId ("$Header: /private/postgres/src/planner/path/RCS/mergeutils.c,v 1.14 1992/07/12 10:57:31 joey Exp $"); */
  12.  
  13. /*     
  14.  *      EXPORTS
  15.  *             group-clauses-by-order
  16.  *             match-order-mergeinfo
  17.  */
  18.  
  19. #include "nodes/pg_lisp.h"
  20. #include "nodes/relation.h"
  21. #include "nodes/relation.a.h"
  22.  
  23. #include "planner/internal.h"
  24. #include "planner/mergeutils.h"
  25. #include "planner/clauses.h"
  26.  
  27. /*    
  28.  *        group-clauses-by-order
  29.  *    
  30.  *        If a join clause node in 'clauseinfo-list' is mergesortable, store
  31.  *        it within a mergeinfo node containing other clause nodes with the same
  32.  *        mergesort ordering.
  33.  *    
  34.  *        'clauseinfo-list' is the list of clauseinfo nodes
  35.  *        'inner-relid' is the relid of the inner join relation
  36.  *    
  37.  *        Returns the new list of mergeinfo nodes.
  38.  *    
  39.  */
  40. LispValue
  41. group_clauses_by_order (clauseinfo_list,inner_relid)
  42.      LispValue clauseinfo_list,inner_relid ;
  43. {
  44.      LispValue mergeinfo_list = LispNil;
  45.      LispValue xclauseinfo = LispNil;
  46.     
  47.      foreach (xclauseinfo, clauseinfo_list) {
  48.       CInfo clauseinfo = (CInfo)CAR(xclauseinfo);
  49.       MergeOrder merge_ordering = get_mergesortorder (clauseinfo);
  50.       
  51.       if ( merge_ordering) {
  52.            /*    Create a new mergeinfo node and add it to */
  53.            /*    'mergeinfo-list' if one does not yet exist for this */
  54.            /*    merge ordering. */
  55.            MInfo xmergeinfo = 
  56.          match_order_mergeinfo (merge_ordering,mergeinfo_list);
  57.            LispValue clause = get_clause (clauseinfo);
  58.            Var leftop = get_leftop (clause);
  59.            Var rightop = get_rightop (clause);
  60.            JoinKey keys;
  61.            
  62.            if(equal ((Node)inner_relid,
  63.              (Node)lispInteger(get_varno (leftop)))) {
  64.             keys = MakeJoinKey ((LispValue)rightop,(LispValue)leftop);
  65.            } 
  66.            else {
  67.             keys = MakeJoinKey ((LispValue)leftop,(LispValue)rightop);
  68.            } 
  69.  
  70.            if ( null (xmergeinfo)) {
  71.             xmergeinfo = RMakeMInfo();
  72.             set_m_ordering(xmergeinfo,merge_ordering);
  73.             mergeinfo_list = push ((LispValue)xmergeinfo,
  74.                        mergeinfo_list);
  75.            }
  76.  
  77.            set_clauses((JoinMethod)xmergeinfo,
  78.                     push (clause,
  79.                   joinmethod_clauses((JoinMethod)xmergeinfo)));
  80.            set_jmkeys((JoinMethod)xmergeinfo, 
  81.              push((LispValue)keys,
  82.                   joinmethod_keys((JoinMethod)xmergeinfo)));
  83.       }
  84.      }
  85.      return(mergeinfo_list);
  86.  
  87. }  /* function end  */
  88.  
  89.  
  90. dump_rel(rel)
  91.  
  92. Rel rel;
  93.  
  94. {
  95.     printf("relids: %d\n", rel->relids);
  96.     printf("indexed %c\n", (rel->indexed ? 't' : 'f'));
  97.     printf("pages %d tuples %d size %d width %d\n", rel->pages, rel->tuples,
  98.            rel->size, rel->width);
  99.     printf("targetlist: \n");
  100.     lispDisplay(rel->targetlist);
  101.     printf("\npathlist: \n");
  102.     lispDisplay(rel->targetlist);
  103.     printf("\nclauseinfo: \n");
  104.     lispDisplay(rel->clauseinfo);
  105. }
  106.  
  107.  
  108. /*    
  109.  *        match-order-mergeinfo
  110.  *    
  111.  *        Searches the list 'mergeinfo-list' for a mergeinfo node whose order
  112.  *        field equals 'ordering'.
  113.  *    
  114.  *        Returns the node if it exists.
  115.  *    
  116.  */
  117.  
  118. /*  .. group-clauses-by-order, match-unsorted-inner, match-unsorted-outer
  119.  */
  120. MInfo
  121. match_order_mergeinfo (ordering,mergeinfo_list)
  122.      MergeOrder ordering;
  123.      List mergeinfo_list ;
  124. {
  125.      MergeOrder xmergeorder;
  126.      LispValue xmergeinfo = LispNil;
  127.      bool temp1 ;
  128.      bool temp2 ;
  129.      foreach(xmergeinfo, mergeinfo_list) {
  130.       MInfo mergeinfo = (MInfo)CAR(xmergeinfo);
  131.       xmergeorder = get_m_ordering(mergeinfo);
  132.       temp1 =(bool)( IsA(ordering,MergeOrder) &&
  133.             equal_merge_merge_ordering(ordering,xmergeorder));
  134.       temp2 = (bool) (!IsA(ordering,MergeOrder) &&
  135.               equal_path_merge_ordering(ordering,xmergeorder));
  136.       if (temp1 || temp2)
  137.         return(mergeinfo);
  138.       
  139.      }
  140.      return((MInfo) LispNil);
  141. }
  142.